package br.com.vilababy.sigvb.mb;

import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import br.com.vilababy.sigvb.SIGVBUtil;
import br.com.vilababy.sigvb.constantes.EstadoEnum;
import br.com.vilababy.sigvb.constantes.LogradouroEnum;
import br.com.vilababy.sigvb.constantes.SIGVBEnum;
import br.com.vilababy.sigvb.modelo.Aluno;
import br.com.vilababy.sigvb.modelo.Responsavel;
import br.com.vilababy.sigvb.repository.AlunoRepository;
import br.com.vilababy.sigvb.repository.ISIGVBRepository;
import br.com.vilababy.sigvb.repository.ResponsavelRepository;

@ManagedBean
@ViewScoped
public class AlunoMBean extends AbstractAlunoMBean implements Serializable{

	/**
	 * @author Diego Patrick da Silva Santos
	 */
	private static final long serialVersionUID = 1L;
	
	private LazyDataModel<Aluno> alunosUsuario = null;
	private List<Aluno> alunosResponsaveis = null;
	private Map<Long, Aluno> mapaAlunos = new HashMap<Long, Aluno>();
	private Responsavel pai = new Responsavel();
	private Responsavel mae = new Responsavel();
	private ISIGVBRepository<Responsavel> repositoryResponsavel;
	private LazyDataModel<Aluno> alunosPaginacao = null;
	private Aluno alunoCameraSelecionado;
	private List<Aluno> comboAlunoCamera;
	
	private List<Responsavel> responsaveis;
	private List<LogradouroEnum> comboLogradouros;
	private List<EstadoEnum> comboEstados;
	
	public AlunoMBean() {
		setRepositoryAluno(new AlunoRepository());
		setAlunoCameraSelecionado(new Aluno());
		setResponsaveis(new ArrayList<Responsavel>());
		this.repositoryResponsavel = new ResponsavelRepository();
	}
	
	@PostConstruct
	public void carregarCombos() {
		this.comboLogradouros = Arrays.asList(LogradouroEnum.values());
		this.comboEstados = Arrays.asList(EstadoEnum.values());
	}

	public String getDataAtual() {
		DateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
		Date data = new Date();
		return formato.format(data);
	}
	
	private void carregarAlunosPaginacao() {
		this.alunosPaginacao = new LazyDataModel<Aluno>() {

			private static final long serialVersionUID = 1L;
			
			@Override
			public List<Aluno> load(int primeiroRegistro, int totalRegistrosPagina,
					String sortField, SortOrder sortOrder, Map<String, Object> filtros) {
				
				setRowCount(((AlunoRepository) repositoryAluno).totalAlunosFiltrados());
				
				setPageSize(totalRegistrosPagina);
				
				return ((AlunoRepository) repositoryAluno).listarParcial(primeiroRegistro, totalRegistrosPagina);
			}
			
		};
		
		adicionarMapaAlunos();
	}
	
	private void consultarUsuariosPaginacao() {
		this.alunosUsuario = new LazyDataModel<Aluno>() {

			private static final long serialVersionUID = 1L;
			
			@Override
			public List<Aluno> load(int primeiroRegistro, int totalRegistrosPagina,
					String campoOrdenacao, SortOrder ordenacao, Map<String, Object> filtros) {
				
				setRowCount(((AlunoRepository) repositoryAluno).totalUsuariosCameraFiltrados());
				
				setPageSize(totalRegistrosPagina);
				
				return ((AlunoRepository) repositoryAluno).consultarAlunosUsuario(primeiroRegistro, totalRegistrosPagina);
			}
		}; 
				
	}
	
	public String exibirPesquisaAluno() {
		return SIGVBUtil.getValorMensagem(SIGVBEnum.NAV_PESQUISA_ALUNO.getValor());
	}
	
	public String exibirCadastroAluno() {
		return SIGVBUtil.getValorMensagem(SIGVBEnum.NAV_CADASTRO_ALUNO.getValor());
	}
	
	public final LazyDataModel<Aluno> getAlunosUsuario() {
		return this.alunosUsuario;
	}
	public final void setAlunosUsuario(LazyDataModel<Aluno> alunosUsuario) {
		this.alunosUsuario = alunosUsuario;
	}
	public List<Aluno> getAlunosResponsaveis() {
		return alunosResponsaveis;
	}
	public void setAlunosResponsaveis(List<Aluno> alunosResponsaveis) {
		this.alunosResponsaveis = alunosResponsaveis;
	}
	public LazyDataModel<Aluno> getAlunosPaginacao() {
		return alunosPaginacao;
	}

	public void setAlunosPaginacao(LazyDataModel<Aluno> alunosPaginacao) {
		this.alunosPaginacao = alunosPaginacao;
	}

	public List<Aluno> getComboAlunos() {
		return comboAlunos;
	}
	public void setComboAlunos(List<Aluno> comboAlunos) {
		this.comboAlunos = comboAlunos;
	}
	public final Responsavel getPai() {
		return pai;
	}

	public final void setPai(Responsavel pai) {
		this.pai = pai;
	}

	public final Responsavel getMae() {
		return mae;
	}

	public final void setMae(Responsavel mae) {
		this.mae = mae;
	}
	
	public List<Aluno> getComboAlunoCamera() {
		return comboAlunoCamera;
	}

	public void setComboAlunoCamera(List<Aluno> comboAlunoCamera) {
		this.comboAlunoCamera = comboAlunoCamera;
	}

	public Aluno getAlunoCameraSelecionado() {
		return alunoCameraSelecionado;
	}

	public void setAlunoCameraSelecionado(Aluno alunoCameraSelecionado) {
		this.alunoCameraSelecionado = alunoCameraSelecionado;
	}

	public List<Responsavel> getResponsaveis() {
		return responsaveis;
	}

	public void setResponsaveis(List<Responsavel> responsaveis) {
		this.responsaveis = responsaveis;
	}
	
	public final List<LogradouroEnum> getComboLogradouros() {
		return this.comboLogradouros;
	}
	
	public List<EstadoEnum> getComboEstados() {
		return comboEstados;
	}
	
	public void adicionarUsuarioCamera(ActionEvent evento) {
		try {
			repositoryAluno.atualizar(getAlunoCamera());
		} catch (Exception ex) {
			SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO_USUARIO_CFTV.getValor()));
		}
		
		SIGVBUtil.adicionarMensagemSucesso(SIGVBUtil.getValorMensagem(SIGVBEnum.LABEL_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.CADASTRO_USUARIO_CAMERA_SUCESSO.getValor()));
		consultarUsuariosPaginacao();
		limparTela();
	}
	
	public void adicionarAluno(ActionEvent evento) {
		try {
			repositoryAluno.inserir(getAluno());
		} catch (Exception ex) {
			SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO_ALUNO.getValor()));
		}
		
		SIGVBUtil.adicionarMensagemSucesso(SIGVBUtil.getValorMensagem(SIGVBEnum.LABEL_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.CADASTRO_ALUNO_SUCESSO.getValor()));
		carregarAlunosPaginacao();
		limparTela();
	}
	
	public void exibirAlunoSelecionado(SelectEvent evento) {
		setAlunoSelecionado(repositoryAluno.get(((Aluno)evento.getObject()).getId()));
		
		if (!getAlunoSelecionado().getResponsaveis().isEmpty() && getAlunoSelecionado().getResponsaveis().get(0).getId() == null) {
			getAlunoSelecionado().setResponsaveis(((ResponsavelRepository) repositoryResponsavel).getPais(getAlunoSelecionado()));
		}
	}
	
	@Override
	protected void limparTela() {
		setAluno(new Aluno());
		setAlunoSelecionado(new Aluno());
	}
	
	private Aluno getAlunoCamera() {
		Aluno aluno = mapaAlunos.get(getAlunoSelecionado().getId());
		aluno.setUsuarioCamera(getAlunoSelecionado().getUsuarioCamera());
		aluno.setSenhaCamera(getAlunoSelecionado().getSenhaCamera());
		return aluno;
	}
	
}
